//package com.punch.system.service.impl;
//
//import cn.hutool.core.collection.CollUtil;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.punch.common.dto.system.area.AreaDTO;
//import com.punch.common.exception.BusinessException;
//import com.punch.common.vo.system.area.TreeAreaVO;
//import com.punch.system.exception.SysExceptionEnum;
//import com.punch.system.mapper.SysAreaMapper;
//import com.punch.system.model.SysArea;
//import com.punch.system.service.AreaService;
//import org.springframework.beans.BeanUtils;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * AreaServiceImpl-地区表 服务实现类  --本类复制1.0版本地区业务实现
// *
// * @author wujj
// * @version 1.0.0
// * @since 2020/6/3 19:09
// */
//@Service
//public class AreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> implements AreaService {
//
//
//    /**
//     * 地区树形
//     *
//     * @param parentId 父id
//     * @return List<TreeAreaVO>
//     * @author wujj
//     * @since 2020/6/4 19:19
//     */
//    @Override
//    public List<TreeAreaVO> treeArea(Long parentId) {
//        return getBaseMapper().selectListByPid(parentId);
//    }
//
//    /**
//     * 新增地区
//     *
//     * @param areaDTO 地区新增表单
//     * @return RestResponse<Integer>
//     * @author wujj
//     * @since 2020/6/4 19:32
//     */
//    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
//    public Long saveArea(AreaDTO areaDTO) {
//        SysArea area = new SysArea();
//        BeanUtils.copyProperties(areaDTO, area);
//        //数据重复校验
//        //areaRepeatCheck(areaDTO.getName(), areaDTO.getParentId() == null ? 0L : areaDTO.getParentId(), 0L);
//        //判断是否有父级
//        SysArea parentArea = null;
//        if (null != areaDTO.getParentId() && 0 != areaDTO.getParentId()) {
//            parentArea = getById(area.getParentId());
//            if (parentArea == null) {
//                throw new BusinessException(SysExceptionEnum.PARENT_DATA_DOES_NOT_EXIST);
//            }
//            area.setParentId(parentArea.getId());
//            area.setParentIds(parentArea.getParentIds() + "," + parentArea.getId());
//            area.setCurrentLevel(parentArea.getCurrentLevel() + 1);
//        }
//        if (!save(area)) {
//            throw new BusinessException(SysExceptionEnum.DATA_INSERT_EXCEPTION);
//        }
//        //数据保存成功,父级"直接子集数量"加1
//        if (null != parentArea) {
//            Integer number = parentArea.getChildNumber() + 1;
//            parentArea.setChildNumber(number);
//            if (!updateById(parentArea)) {
//                throw new BusinessException(SysExceptionEnum.UPDATE_PARENT_DATA_EXCEPTION);
//            }
//        }
//        return area.getId();
//    }
//
//    /**
//     * 修改地区
//     *
//     * @param areaDTO 地区更新表单
//     * @return areaId
//     * @author wujj
//     * @since 2020/6/4 19:47
//     */
//    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
//    public Long updateArea(AreaDTO areaDTO) {
//        //校验数据是否存在
//        SysArea sysAreaEx = getById(areaDTO.getAreaId());
//        if (null == sysAreaEx) {
//            throw new BusinessException(SysExceptionEnum.AREA_NOT_EXIST);
//        }
//        SysArea area = new SysArea();
//        BeanUtils.copyProperties(areaDTO, area);
//        area.setId(areaDTO.getAreaId());
//        //数据重复校验
////        areaRepeatCheck(areaDTO.getName(), areaDTO.getParentId(), sysAreaEx.getId());
////        if (!sysAreaEx.getName().equals(areaDTO.getName()) && 0 != areaDTO.getParentId()) {
////            SysArea parentArea = getById(area.getParentId());
////            if (null == parentArea) {
////                throw new BusinessException(SysExceptionEnum.PARENT_DATA_DOES_NOT_EXIST);
////            }
////        }
//        if (!updateById(area)) {
//            throw new BusinessException(SysExceptionEnum.DATA_UPDATE_EXCEPTION);
//        }
//        return areaDTO.getAreaId();
//    }
//
//    /**
//     * 删除地区
//     *
//     * @param areaId 地区id
//     * @return areaId
//     * @author wujj
//     * @since 2020/6/4 19:54
//     */
//    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
//    public Long deleteArea(Long areaId) {
//        //校验数据是否存在
//        SysArea area = getById(areaId);
//        if (null == area) {
//            throw new BusinessException(SysExceptionEnum.AREA_NOT_EXIST);
//        }
//        //获取指定地区下全部地区数据（含本身）
//        UpdateWrapper<SysArea> updateWrapper = new UpdateWrapper<>();
//        updateWrapper.lambda()
//                .apply("FIND_IN_SET({0},parent_ids)", areaId)
//                .or().eq(SysArea::getId, areaId);
//        //删除自身及所有下级数据
//        if (!remove(updateWrapper)) {
//            throw new BusinessException(SysExceptionEnum.DATA_DELETION_EXCEPTION);
//        }
//        //如有父级，则父级“直接子集数量”减1
//        if (0 != area.getParentId()) {
//            SysArea parentArea = getById(area.getParentId());
//            if (null == parentArea) {
//                throw new BusinessException(SysExceptionEnum.PARENT_DATA_DOES_NOT_EXIST);
//            }
//            parentArea.setChildNumber(parentArea.getChildNumber() - 1);
//            if (!updateById(parentArea)) {
//                throw new BusinessException(SysExceptionEnum.UPDATE_PARENT_DATA_EXCEPTION);
//            }
//        }
//
//        return areaId;
//    }
//
//    /**
//     * 获取地区信息
//     *
//     * @param areaId 地区id
//     * @return TreeAreaVO
//     * @author wujj
//     * @since 2020/7/31 14:27
//     */
//    @Override
//    public TreeAreaVO getFeignArea(Long areaId) {
//        SysArea sysArea = getById(areaId);
//        TreeAreaVO treeAreaVO = new TreeAreaVO();
//        BeanUtils.copyProperties(sysArea, treeAreaVO);
//        return treeAreaVO;
//    }
//
//    /**
//     * 查找该地区id下的子id
//     *
//     * @param parentId 地区父id
//     * @return List<Long>
//     */
//    @Override
//    public List<Long> listFeignChildId(Long parentId) {
//        QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>();
//        queryWrapper.lambda().apply("FIND_IN_SET({0},parent_ids)", parentId);
//        List<SysArea> list = list(queryWrapper);
//        List<Long> retList = new ArrayList<>();
//        list.forEach(sysArea -> retList.add(sysArea.getId()));
//        return retList;
//    }
//
//    /**
//     * 启用/停用地区
//     *
//     * @param areaId 地区id
//     */
//    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
//    public void enableArea(Long areaId) {
//        SysArea sysAreaEX = getById(areaId);
//        if (sysAreaEX == null) {
//            throw new BusinessException(SysExceptionEnum.AREA_NOT_EXIST);
//        }
//        SysArea updateArea = new SysArea();
//        //启用变成停用
//        Integer status = 0;
//        if (sysAreaEX.getStatus() == 1) {
//
//            updateArea.setStatus(status);
//        }
//        //停用变成启用
//        if (sysAreaEX.getStatus() == 0) {
//            status = 1;
//            updateArea.setStatus(status);
//        }
//        updateArea.setId(areaId);
//        updateById(updateArea);
//
//        //父级停用子级也全部停用
//        //获取指定地区下全部地区数据（含本身）
//        QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>();
//        queryWrapper.lambda().apply("FIND_IN_SET({0},parent_ids)", areaId);
//        List<SysArea> childList = list(queryWrapper);
//        if (CollUtil.isNotEmpty(childList)) {
//            List<SysArea> updateList = new ArrayList<>();
//            childList.forEach(sysArea -> {
//                sysArea.setStatus(updateArea.getStatus());
//                updateList.add(sysArea);
//            });
//            updateBatchById(updateList);
//        }
//
//    }
//
//    /**
//     * 地区树形（根据状态查询）
//     *
//     * @param status   状态 0-停用 1-启用
//     * @param parentId 父节点id
//     * @return
//     */
//    @Override
//    public List<TreeAreaVO> treeAreaStatus(Integer status, Long parentId,Integer type) {
//        //查看是否有子集
//        SysArea sysArea = getById(parentId);
//        List<TreeAreaVO> retList;
//        if (type == 0) {
//            //说明没有子集返回自身
//            retList = new ArrayList<>();
//            TreeAreaVO treeAreaVO = new TreeAreaVO();
//            BeanUtils.copyProperties(sysArea, treeAreaVO);
//            treeAreaVO.setAreaId(sysArea.getId());
//            retList.add(treeAreaVO);
//        } else {
//            retList = getBaseMapper().treeAreaStatus(status, parentId);
//        }
//        return retList;
//    }
//
//
//    /**
//     * 数据重复校验
//     *
//     * @param areaName 地区名称
//     * @param areaId   地区id，新增为0
//     * @param parentId 父id
//     * @author wujj
//     * @since 2020/6/6 11:25
//     */
//    private void areaRepeatCheck(String areaName, Long parentId, Long areaId) {
//        //校验同级地区名是否重复
//        QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>();
//        queryWrapper.lambda()
//                .eq(SysArea::getParentId, parentId)
//                .eq(SysArea::getName, areaName);
//        if (!areaId.equals(0L)) {
//            queryWrapper.lambda().notIn(SysArea::getId, areaId);
//        }
//        if (count(queryWrapper) > 0) {
//            throw new BusinessException(SysExceptionEnum.SIBLING_DATA_NAMES_ARE_NOT_REPEATABLE);
//        }
//    }
//}
